
"""
异常是程序运行中错误的信号，一旦出错，python会创建一个异常的的对象，若是未被处理，程序就会终止
三要素：

print(a)
1.追踪信息   : File "C:\\Users\\Allen\\PycharmProjects\\qc_liu\\day_6\\异常.py", line 10, in <module>
2.异常的类型  ： NameError
3.异常的信息  ：  name 'a' is not defined
异常不等于语法错误
语法错误是不能被捕捉的
逻辑错误是被捕捉到的    try

异常错误分为两大类：
1. 是语法的错误
2. 是逻辑错误


为什么要处理异常
避免程序因为未处理的错误而崩溃
"""


# date = [1,2]
# print(date[3])
# print("会不会执行到这里")

# data = [1, 2]
# try:
#     print(data[5])
# except IndexError:
#     print("索引超出范围")
# print("程序继续运行")


"""
异常的处理的基本结构

try:
   可能出错的代码
except:
  处理异常
  
else:
   无异常的时候，要执行的代码块（可选）
finally:
    无论有没有异常，我们都要执行的（可选）
"""

#模式1   单异常进行处理
"""
try:
    ...
except NameError as e:

try:
    print(x)   # NameError
except NameError as e:   #  as e    是一个别名，我们将报错信息存储到这里，并在下方进行调用
    print("未定义变量",e)
    
    
多异常处理
try:
    L = [1,2]
    print(L[5])
    print(y)  #不会执行
except NameError:
    print('名字错误')
except IndexError:
    print('索引错误')
"""

# 合并异常
# try:
#     L = [1,2]
#     print(L[5])
#     print(y)  #不会执行
# except(NameError,IndexError) as e:
#     print("名字或索引错误",e)

#万能捕获
# try:
#     int('abc')
# except Exception as e:
#     print("发生了错误",e)


# 主动抛出异常   raise + 内置/自定义异常
# raise ValueError("消息")

#主动抛出异常，用于内务的校验
# L = [1,2,3]
# if len(L) !=5:
#     raise ValueError("列表的长度必须为5")



# assert（断言）
# 快速的验证前提的条件，失败的时候，抛出 AssertionError
# 开发或者测试的时候，生产环境可以用 -O 参数是禁用
# 不可用于用户的输入校验

# l = [1,2,3,4,5]
# assert len(l) == 5
# assert len(l) == 6
